package com.cencat.route.entity;

import com.baomidou.mybatisplus.annotation.*;
import jakarta.validation.constraints.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 路线信息实体类
 * 
 * @author cencat
 * @since 2024-01-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("route")
public class Route implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 路线ID
     */
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;

    /**
     * 路线编号
     */
    @NotBlank(message = "路线编号不能为空")
    @Size(max = 50, message = "路线编号长度不能超过50个字符")
    @TableField("route_code")
    private String routeCode;

    /**
     * 路线名称
     */
    @NotBlank(message = "路线名称不能为空")
    @Size(max = 100, message = "路线名称长度不能超过100个字符")
    @TableField("route_name")
    private String routeName;

    /**
     * 路线描述
     */
    @Size(max = 500, message = "路线描述长度不能超过500个字符")
    @TableField("route_description")
    private String routeDescription;

    /**
     * 起点名称
     */
    @NotBlank(message = "起点名称不能为空")
    @Size(max = 100, message = "起点名称长度不能超过100个字符")
    @TableField("start_point_name")
    private String startPointName;

    /**
     * 起点地址
     */
    @NotBlank(message = "起点地址不能为空")
    @Size(max = 200, message = "起点地址长度不能超过200个字符")
    @TableField("start_point_address")
    private String startPointAddress;

    /**
     * 起点纬度
     */
    @NotNull(message = "起点纬度不能为空")
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @Digits(integer = 3, fraction = 6, message = "纬度格式不正确")
    @TableField("start_latitude")
    private BigDecimal startLatitude;

    /**
     * 起点经度
     */
    @NotNull(message = "起点经度不能为空")
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @Digits(integer = 3, fraction = 6, message = "经度格式不正确")
    @TableField("start_longitude")
    private BigDecimal startLongitude;

    /**
     * 终点名称
     */
    @NotBlank(message = "终点名称不能为空")
    @Size(max = 100, message = "终点名称长度不能超过100个字符")
    @TableField("end_point_name")
    private String endPointName;

    /**
     * 终点地址
     */
    @NotBlank(message = "终点地址不能为空")
    @Size(max = 200, message = "终点地址长度不能超过200个字符")
    @TableField("end_point_address")
    private String endPointAddress;

    /**
     * 终点纬度
     */
    @NotNull(message = "终点纬度不能为空")
    @DecimalMin(value = "-90.0", message = "纬度范围不正确")
    @DecimalMax(value = "90.0", message = "纬度范围不正确")
    @Digits(integer = 3, fraction = 6, message = "纬度格式不正确")
    @TableField("end_latitude")
    private BigDecimal endLatitude;

    /**
     * 终点经度
     */
    @NotNull(message = "终点经度不能为空")
    @DecimalMin(value = "-180.0", message = "经度范围不正确")
    @DecimalMax(value = "180.0", message = "经度范围不正确")
    @Digits(integer = 3, fraction = 6, message = "经度格式不正确")
    @TableField("end_longitude")
    private BigDecimal endLongitude;

    /**
     * 路线距离(公里)
     */
    @NotNull(message = "路线距离不能为空")
    @DecimalMin(value = "0.1", message = "路线距离必须大于0")
    @Digits(integer = 8, fraction = 2, message = "路线距离格式不正确")
    @TableField("distance")
    private BigDecimal distance;

    /**
     * 预计时长(分钟)
     */
    @NotNull(message = "预计时长不能为空")
    @Min(value = 1, message = "预计时长必须大于0")
    @TableField("estimated_duration")
    private Integer estimatedDuration;

    /**
     * 路线类型：1-城市内，2-城际，3-省际，4-跨国
     */
    @NotNull(message = "路线类型不能为空")
    @TableField("route_type")
    private Integer routeType;

    /**
     * 运输方式：1-公路，2-铁路，3-航空，4-水运
     */
    @NotNull(message = "运输方式不能为空")
    @TableField("transport_mode")
    private Integer transportMode;

    /**
     * 基础费用
     */
    @NotNull(message = "基础费用不能为空")
    @DecimalMin(value = "0.01", message = "基础费用必须大于0")
    @Digits(integer = 10, fraction = 2, message = "基础费用格式不正确")
    @TableField("base_fee")
    private BigDecimal baseFee;

    /**
     * 每公里费用
     */
    @DecimalMin(value = "0.00", message = "每公里费用不能为负数")
    @Digits(integer = 8, fraction = 2, message = "每公里费用格式不正确")
    @TableField("per_km_fee")
    private BigDecimal perKmFee;

    /**
     * 每分钟费用
     */
    @DecimalMin(value = "0.00", message = "每分钟费用不能为负数")
    @Digits(integer = 8, fraction = 2, message = "每分钟费用格式不正确")
    @TableField("per_minute_fee")
    private BigDecimal perMinuteFee;

    /**
     * 路线状态：0-禁用，1-启用，2-维护中
     */
    @NotNull(message = "路线状态不能为空")
    @TableField("route_status")
    private Integer routeStatus;

    /**
     * 是否热门路线：0-否，1-是
     */
    @TableField("is_popular")
    private Integer isPopular;

    /**
     * 优先级
     */
    @TableField("priority")
    private Integer priority;

    /**
     * 最大载重(吨)
     */
    @DecimalMin(value = "0.0", message = "最大载重不能为负数")
    @Digits(integer = 8, fraction = 2, message = "最大载重格式不正确")
    @TableField("max_load_weight")
    private BigDecimal maxLoadWeight;

    /**
     * 最大体积(立方米)
     */
    @DecimalMin(value = "0.0", message = "最大体积不能为负数")
    @Digits(integer = 8, fraction = 2, message = "最大体积格式不正确")
    @TableField("max_load_volume")
    private BigDecimal maxLoadVolume;

    /**
     * 适用车型
     */
    @Size(max = 200, message = "适用车型长度不能超过200个字符")
    @TableField("suitable_vehicle_types")
    private String suitableVehicleTypes;

    /**
     * 路况信息
     */
    @Size(max = 500, message = "路况信息长度不能超过500个字符")
    @TableField("road_conditions")
    private String roadConditions;

    /**
     * 通行限制
     */
    @Size(max = 500, message = "通行限制长度不能超过500个字符")
    @TableField("traffic_restrictions")
    private String trafficRestrictions;

    /**
     * 收费站信息
     */
    @Size(max = 500, message = "收费站信息长度不能超过500个字符")
    @TableField("toll_info")
    private String tollInfo;

    /**
     * 服务区信息
     */
    @Size(max = 500, message = "服务区信息长度不能超过500个字符")
    @TableField("service_area_info")
    private String serviceAreaInfo;

    /**
     * 危险路段信息
     */
    @Size(max = 500, message = "危险路段信息长度不能超过500个字符")
    @TableField("dangerous_sections")
    private String dangerousSections;

    /**
     * 天气影响等级：1-无影响，2-轻微影响，3-中等影响，4-严重影响
     */
    @TableField("weather_impact_level")
    private Integer weatherImpactLevel;

    /**
     * 使用次数
     */
    @Min(value = 0, message = "使用次数不能为负数")
    @TableField("usage_count")
    private Integer usageCount;

    /**
     * 评分
     */
    @DecimalMin(value = "0.0", message = "评分不能为负数")
    @DecimalMax(value = "5.0", message = "评分不能超过5.0")
    @Digits(integer = 1, fraction = 1, message = "评分格式不正确")
    @TableField("rating")
    private BigDecimal rating;

    /**
     * 评价数量
     */
    @Min(value = 0, message = "评价数量不能为负数")
    @TableField("review_count")
    private Integer reviewCount;

    /**
     * 最后使用时间
     */
    @TableField("last_used_time")
    private LocalDateTime lastUsedTime;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 创建人ID
     */
    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private Long createBy;

    /**
     * 更新人ID
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private Long updateBy;

    /**
     * 是否删除：0-未删除，1-已删除
     */
    @TableLogic
    @TableField("is_deleted")
    private Integer isDeleted;

    /**
     * 版本号(乐观锁)
     */
    @Version
    @TableField("version")
    private Integer version;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    @TableField("remark")
    private String remark;
}